class Testcase:  # 用例数据模型类
    def __init__(self, cid, module, title, priority, condition, step, expected, actual, bug_id):
        self.cid = cid  # 用例编号，作为唯一标识。
        self.module = module  # 功能模块。
        self.title = title  # 测试标题。
        self.priority = priority  # 优先级别。
        self.condition = condition  # 前置条件。
        self.step = step  # 测试步骤。
        self.expected = expected  # 预期结果。
        self.actual = actual  # 实际结果。
        self.bug_id = bug_id  # 关联Bug的ID。


class Bug:  # Bug数据模型类
    def __init__(self, bid, description, status):
        self.bid = bid  # Bug编号，作为唯一标识。
        self.description = description  # Bug描述。
        self.status = status  # Bug状态（如：新建、已修复、已关闭等）。


class BugManager(Bug):  # Bug管理类,封装Bug管理的业务逻辑
    def __init__(self):
        self.bugs = []  # 一个列表，用于存储所有 Bug 实例。

    def list_bugs(self):  # 返回所有Bug的数据。
        print("所有的Bug数据:")
        for item in self.bugs:
            print(item)

    def add_bug(self, bug):  # 将新的 Bug 实例添加到 bugs 列表。
        for item in self.bugs:
            if item["bid"] == bug.bid:
                return f"bid:{item['bid']}已存在"
        self.bugs.append({"bid": bug.bid, "description": bug.description, "status": bug.status})

    def get_bug(self, bid):  # 根据Bug编号从 bugs 中查找并返回 Bug 实例。
        for item in self.bugs:
            if item["bid"] == bid:
                return item

    def update_bug(self, bid, bug):  # 根据Bug编号更新 bugs 中的 Bug 实例。
        for item in self.bugs:
            if item["bid"] == bid:
                item["description"] = bug.description
                item["status"] = bug.status

    def delete_bug(self, bid):  # 根据Bug编号从 bugs 中删除 Bug 实例。
        for item in self.bugs:
            if item["bid"] == bid:
                self.bugs.remove(item)


class TestcaseManager(Testcase):  # 用例管理类,封装用例管理的业务逻辑
    def __init__(self):
        self.testcases = []

    def list_testcases(self):  # 返回所有测试用例的数据。
        print("所有测试用例的数据:")
        for item in self.testcases:
            print(item)

    def add_testcase(self, testcase):  # 将新的 Testcase 实例添加到 testcases 列表。
        for item in self.testcases:
            if item["cid"] == testcase.cid:
                return f"cid:{item['cid']}已存在"
        self.testcases.append({"cid": testcase.cid,
                               "module": testcase.module,
                               "title": testcase.title,
                               "priority": testcase.priority,
                               "condition": testcase.condition,
                               "step": testcase.step,
                               "expected": testcase.expected,
                               "actual": testcase.actual,
                               "bug_id": testcase.bug_id})

    def get_testcase(self, cid):  # 根据用例编号从 testcases 中查找并返回 Testcase 实例。
        for item in self.testcases:
            if item["cid"] == cid:
                return item

    def update_testcase(self, cid, testcase):  # 根据用例编号更新 testcases 中的 Testcase 实例。
        for item in self.testcases:
            if item["cid"] == cid:
                item["module"] = testcase.module
                item["title"] = testcase.title
                item["priority"] = testcase.priority
                item["condition"] = testcase.condition
                item["step"] = testcase.step
                item["expected"] = testcase.expected
                item["actual"] = testcase.actual
                item["bug_id"] = testcase.bug_id

    def delete_testcase(self, cid):  # 根据用例编号从 testcases 中删除 Testcase 实例。
        for item in self.testcases:
            if item["cid"] == cid:
                self.testcases.remove(item)

    def search_testcases(self, module=None, priority=None, bug_id=None):  # 根据条件搜索测试用例。
        print(f"根据 module:{module},priority:{priority},bug_id:{bug_id} 查找")
        for item in self.testcases:
            if module in item["module"] and priority in item["priority"] and bug_id in item["bug_id"]:
                return item


if __name__ == "__main__":
    # 初始化
    testcase1 = Testcase(1, "功能模块1", "测试标题1", "优先级别1", "前置条件1",
                         "测试步骤1", "预期结果", " 实际结果1", "关联Bug的ID1")
    testcase2 = Testcase(2, "功能模块2", "测试标题2", "优先级别2", "前置条件2",
                         "测试步骤2", "预期结果2", " 实际结果2", "关联Bug的ID2")
    bug1 = Bug(1, "Bug描述1", "新建1")
    bug2 = Bug(2, "Bug描述2", "新建2")

    bugManager = BugManager()
    testcaseManager = TestcaseManager()

    # 添加bug
    bugManager.add_bug(bug1)
    bugManager.add_bug(bug2)
    bugManager.list_bugs()
    print()

    # 添加用例数据
    testcaseManager.add_testcase(testcase1)
    testcaseManager.add_testcase(testcase2)
    testcaseManager.list_testcases()
    print()

    # 根据bid查找bug
    print(bugManager.get_bug(1))
    print()

    # 根据bid更新bug数据
    bug3 = Bug(2, "Bug描述2->3", "新建2->3")
    bugManager.update_bug(2, bug3)
    bugManager.list_bugs()
    print()

    # 根据bin删除bug
    bugManager.delete_bug(2)
    bugManager.list_bugs()
    print()

    # 根据cid查找用例
    print(testcaseManager.get_testcase(1))
    print()

    # 根据cid更新用例数据
    testcase3 = Testcase(2, "功能模块2->3", "测试标题2->3", "优先级别2->3", "前置条件2->3", "测试步骤2->",
                         "预期结果2->3", " 实际结果2->3", "关联Bug的ID2->3")
    testcaseManager.update_testcase(2, testcase3)
    testcaseManager.list_testcases()
    print()

    # 根据cid删除用例数据
    testcaseManager.delete_testcase(2)
    testcaseManager.list_testcases()
    print()

    # 根据条件搜索测试用例
    print(testcaseManager.search_testcases("功能", "优先", "Bug"))
